home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / c / agl1.04_demo.lha / box.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-28  |  3.9 KB  |  238 lines

  1. #ifdef _AMIGA
  2. #include<exec/types.h>
  3. #include<intuition/intuitionbase.h>
  4. #include<functions.h>
  5. #endif
  6.  
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9. #include<string.h>
  10. #include<math.h>
  11. #include<gl.h>
  12. #include<device.h>
  13.  
  14. #define MINDIST 4.0
  15.  
  16. short CubeVert[8][3]=
  17.     {
  18.     -1,-1,-1,
  19.     -1,-1, 1,
  20.     -1, 1, 1,
  21.     -1, 1,-1,
  22.      1,-1,-1,
  23.      1,-1, 1,
  24.      1, 1, 1,
  25.      1, 1,-1,
  26.     };
  27.  
  28. short CubeEdge[24]=
  29.     {
  30.     1,2,3,0,
  31.     4,5,1,0,
  32.     4,7,6,5,
  33.     6,7,3,2,
  34.     6,2,1,5,
  35.     4,0,3,7,
  36.     };
  37.  
  38. int main(int argc,char **argv,char **envp)
  39.     {
  40.     long screenx,screeny;
  41.     long wx,wy;
  42.     long lastx,lasty;
  43.     long wid;
  44.  
  45.     short left=FALSE,middle=FALSE;
  46.     short quit=FALSE;
  47.     short dbuffer=TRUE;
  48.     short hires=FALSE;
  49.     short breakout;
  50.     short signal,data;
  51.     short c,m;
  52.     short i,j;
  53.  
  54.     float distance=MINDIST;
  55.     float theta=0.0,phi=0.0,delta_theta=0.0,delta_phi=0.0;
  56.  
  57.     /* decipher argument: s for single buffer, h for hires (Amiga only) */
  58.     if(argc>1)
  59.         {
  60.         for(m=0;m<strlen(argv[1]);m++)
  61.             switch(c=argv[1][m])
  62.                 {
  63.                 case 's':
  64.                     dbuffer=FALSE;
  65.                     break;
  66.                 case 'h':
  67.                     hires=TRUE;
  68.                     break;
  69.                 }
  70.         }
  71.  
  72. #if _AMIGA
  73.  
  74.     /* optionally use hi-res, (lo-res is default) */
  75.     if(hires)
  76.         AGLconfig(640,400,4);
  77.     else
  78.         AGLconfig(350,225,4);
  79.  
  80. #endif
  81.  
  82.     /* get screen size */
  83.     screenx=getgdesc(GD_XPMAX);
  84.     screeny=getgdesc(GD_YPMAX);
  85.  
  86.     /* run process in foreground */
  87.     foreground();
  88.  
  89.     /* set window size and open */
  90.     prefsize(screenx/2,screeny/2);
  91.     wid=winopen("box");
  92.  
  93.     /* release non-sizable constraint */
  94.     winconstraints();
  95.  
  96.     /* optionally activate double buffering */
  97.     if(dbuffer)
  98.         doublebuffer();
  99.     gconfig();
  100.  
  101.     /* don't draw backfacing polygons */
  102.     backface(TRUE);
  103.  
  104.     /* que some events */
  105.     qdevice(WINQUIT);
  106.     qdevice(ESCKEY);
  107.     qdevice(LEFTMOUSE);
  108.     qdevice(RIGHTMOUSE);
  109.  
  110.     /* tie position event to middle mouse button */
  111.     tie(RIGHTMOUSE,MOUSEX,MOUSEY);
  112.  
  113.     /* event loop */
  114.     while(!quit)
  115.         {
  116.         breakout=FALSE;
  117.  
  118.         /* while events still on que */
  119.         while(qtest() && !breakout)
  120.             {
  121.             signal=qread(&data);
  122.  
  123.             switch(signal)
  124.                 {
  125.                 case WINQUIT:
  126.                 case ESCKEY:
  127.                     quit=TRUE;
  128.                     break;
  129.  
  130.                 case LEFTMOUSE:
  131.                     if(data)
  132.                         {
  133.                         left=TRUE;
  134.                         qdevice(MOUSEY);
  135.                         lasty=getvaluator(MOUSEY);
  136.                         }
  137.                     else
  138.                         {
  139.                         left=FALSE;
  140.                         unqdevice(MOUSEY);
  141.                         }
  142.                     break;
  143.  
  144.                 case RIGHTMOUSE:
  145.                     if(data)
  146.                         {
  147.                         middle=TRUE;
  148.                         qdevice(MOUSEX);
  149.                         qdevice(MOUSEY);
  150.                         lastx=getvaluator(MOUSEX);
  151.                         lasty=getvaluator(MOUSEY);
  152.                         }
  153.                     else
  154.                         {
  155.                         middle=FALSE;
  156.                         delta_theta=getvaluator(MOUSEX)-lastx;
  157.                         delta_phi=getvaluator(MOUSEY)-lasty;
  158.                         unqdevice(MOUSEX);
  159.                         unqdevice(MOUSEY);
  160.                         }
  161.                     break;
  162.  
  163.                 case MOUSEX:
  164.                     if(middle)
  165.                         {
  166.                         delta_theta=data-lastx;
  167.                         lastx=data;
  168.                         }
  169.                     break;
  170.  
  171.                 case MOUSEY:
  172.                     if(middle)
  173.                         {
  174.                         delta_phi=data-lasty;
  175.                         lasty=data;
  176.                         breakout=TRUE;
  177.                         }
  178.                     else if(left)
  179.                         {
  180.                         distance+=data-lasty;
  181.                         lasty=data;
  182.  
  183.                         if(distance<MINDIST)
  184.                             distance=MINDIST;
  185.                         breakout=TRUE;
  186.                         }
  187.                     break;
  188.                 }
  189.             }
  190.  
  191.         theta+=delta_theta;
  192.         phi+=delta_phi;
  193.  
  194.         if(middle)
  195.             {
  196.             delta_theta=0.0;
  197.             delta_phi=0.0;
  198.             }
  199.  
  200.         pushmatrix();
  201.  
  202.         /* tranlate and rotate cube into position */
  203.         translate(0.0,0.0,distance);
  204.         rot(-phi,'x');
  205.         rot(theta,'y');
  206.  
  207.         /* get window size and reset view */
  208.         getsize(&wx,&wy);
  209.         viewport(0,wx-1,0,wy-1);
  210.         perspective(600,wx/(float)wy,0.1,10.0);
  211.  
  212.         /* background */
  213.         color(CYAN);
  214.         clear();
  215.  
  216.         /* six faces */
  217.         for(j=0;j<6;j++)
  218.             {
  219.             color(j);
  220.  
  221.             bgnpolygon();
  222.  
  223.             for(i=0;i<4;i++)
  224.                 v3s(CubeVert[CubeEdge[j*4+i]]);
  225.  
  226.             endpolygon();
  227.             }
  228.  
  229.         popmatrix();
  230.  
  231.         if(dbuffer)
  232.             swapbuffers();
  233.         }
  234.  
  235.     winclose(wid);
  236.     return 0;
  237.     }
  238.